package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 队列   包位置：java.util
 * Queue Deque 队列
 * 作用：实现数据的有序存储，用于数据缓冲、多线程协调线程使用
 * Collection顶级集合下子集：Queue集合接口
 */
public class QueueAPI {
    @Test
    public void testQueue() {
        //创建队列--自己使用功能
        Queue<String> queue = new LinkedList<>();
/**
 * offer(E e)       返回值：boolean----add一样
 * 作用：入队操作---队尾操作--队尾追加元素
 *
 */
        queue.offer("凤凰传奇");
        queue.offer("任贤齐");
        queue.offer("王菲");
        queue.offer("那英");
        System.out.println("队列：" + queue);
        /**
         * poll()     返回值：E
         * 作用：出队操作，获取队首元素，，并且将元素从队列元素中删除
         */
        String str = queue.poll();
        str = queue.poll();
        System.out.println("队列出队：" + str);
        System.out.println("队列：" + queue);
        /**
         * peek()  返回值：E
         * 作用：出队操作，获取队首元素，不删除队列元素
         */
        str = queue.peek();    //王菲
        System.out.println("队列出队：[peek]：" + str);
        System.out.println("队列：" + queue);
        /**
         * 需求：队列--【历史名人】--遍历队列  1.用while方式 遍历队列中历史名人，遍历完毕后元素清空
         *                                2.用增强for，遍历队列中历史名人，遍历完毕后元素还在
         */
    }

    @Test
    public void testHistory() {
        Queue<String> q = new LinkedList<>();
        q.offer("秦始皇");
        q.offer("王安石");
        q.offer("柳宗元");
        q.offer("汉武帝");
        while (q.size() > 0) {
            q.poll();//出队首删除队首
            System.out.println("队列：" + q);
        }
        for (String str : q) {
            q.peek();
        }
        System.out.println("队列：" + q);
    }

    /**
     * 双端队列   Deque继承于Queue接口
     * 作用：入队和出队操作---保存数据，，可以在两端插入和删除元素
     * Deque接口中的方法：与Queue一致，，拓展几个方法
     * <p>
     * <p>
     * push():压栈--功能：offer一致
     * pop():出栈--功能：pollLast一致
     * 栈结构【业务：撤销操作】
     * --压栈：先进后出
     */
    @Test
    public void testDeque() {
        //创建双端队列
        Deque<String> d = new LinkedList<>();
        d.offer("香蕉");
        d.offer("苹果");
        d.offer("火龙果");
        d.offer("葡萄");
        System.out.println("Deque队列：" + d);
        //双端增加：addFirst()给队首添加元素  addLast()给队尾添加元素
        d.addFirst("西瓜");
        d.addFirst("草莓");
        System.out.println("双端队列：" + d);
        //双端删除：poll peek
        d.pollFirst();  //pollFirst()出队队首，，队列中队首删除
        System.out.println("删除队首：" + d);
        d.peekFirst();
        System.out.println("不删除队首：" + d);
        //获取队列元素--队首、队尾---getFirst/getLast
        System.out.println("队列【队首】：" + d.getFirst());
        System.out.println("队列【队尾】：" + d.getLast());
    }

    /**
     * push():压栈--功能：offer一致
     * pop():出栈--功能：pollLast一致
     * 栈结构【业务：撤销操作】
     * -压栈：先进后出
     */
    @Test
    public void testStack() {
        Deque<String> stack = new LinkedList<>();
        stack.push("精卫");
        stack.push("后羿");
        stack.push("夸父");
        System.out.println("栈结构：" + stack);
        String str = stack.pop();  //pop获取尾元素
        System.out.println("栈结构【出栈】：" + str);
        System.out.println("双端队列："+stack);
        //队列中：pop poll peek方法的使用特点！
        //答：pop方法针对栈结构： Deque
        // 特点：针对双端队列最后添加的元素【队首】获取队首元素
        //poll和peek是队列的结构：
        //特点：针对与队列追加元素【队首】，，poll获取队首元素并删除
        //                              peek获取队首元素并保存


    }
}
